package es.udc.acs.consorcio.client;

import java.net.SocketTimeoutException;

import es.udc.acs.consorcio.sesion.Sesion;
import es.udc.acs.parser.ParserMensaje;
import es.udc.acs.udp.ClienteUDP;
import es.udc.acs.utils.CodigosFAP;
import es.udc.acs.utils.GestorProperties;

public class ControlClient {

	private ControlClient(){}
	
	public static boolean startRecuperacion(Sesion sesion){
		return sendRequest(sesion, CodigosFAP.CM_C_PC_RECUPERACION,
				CodigosFAP.CM_B_RC_RECUPERACION);
	}
	
	public static boolean finRecuperacion(Sesion sesion){

		return sendRequest(sesion, CodigosFAP.CM_C_PC_FIN_RECUPERACION,
				CodigosFAP.CM_B_RC_FIN_RECUPERACION);
	}
	
	private static boolean sendRequest(Sesion sesion, String codQuestion,
			String codResponse){
		String idConsorcio = 
			GestorProperties.devolverPropiedad(GestorProperties.IDCONSORCIO);
		String message;
		String response;
		String origen;
		String destino;
		String cuerpo;
		
		message = idConsorcio + sesion.getBanco() + codQuestion;
		try {
			response = ClienteUDP.sendMessage(
					sesion.getHost(),sesion.getPort(),message, 30);
		} catch (SocketTimeoutException e) {
			return false;
		} 
		origen  = ParserMensaje.obtenerOrigen(response);
		destino = ParserMensaje.obtenerDestino(response);
		
		if((!origen.equals(sesion.getBanco())) || (!destino.equals(idConsorcio))){
			return false;
		}
		if(ParserMensaje.obtenerTipo(response).equals(codResponse)){
			cuerpo = ParserMensaje.obtenerCuerpo(response);
			if((ParserMensaje.obtenerCodRespuesta(cuerpo).equals("00"))
				&& (ParserMensaje.obtenerCodError(cuerpo).equals(CodigosFAP.CODRE_CORRECTA))){
				return true;
			}
		}
		return false;
	}
}
